#ifndef _MB_COMM_H_
#define _MB_COMM_H_

#include "mb_functioncode.h"
#include "mb_datamodel.h"

/**
 * @brief 位数组转字节数据, 读数据时,可能会从一个字节的中间读取,比如第1,2...7
 * @param hslave       从站指针
 * @param StartAddress 位开始的地址,非字节序号
 * @param Quantity     位数量
 * @param pDst         写入数据的位置
 * @param pDstLen      写入数据的长度
 * @ret   MB_OK 成功 MB_ERROR 错误
*/
MB_StatusTypeDef MB_BitArrayToByteArray(
    uint8_t  *pSrc, 
    uint16_t  StartAddress, 
    uint16_t  Quantity, 
    uint8_t  *pDst,
    uint16_t *pDstLen
    );

/**
 * @brief 字节数据转位数组, 写数据时,可能会从一个字节的中间开始写,比如第1,2...7
 * @param hslave       从站指针
 * @param StartAddress 位开始的地址,非字节序号
 * @param Quantity     位数量
 * @param pDst         写入数据的位置
 * @param pDstLen      写入数据的长度
 * @ret   MB_OK 成功 MB_ERROR 错误
*/
MB_StatusTypeDef MB_ByteArrayToBitArray(
    uint8_t  *pSrc, 
    uint16_t  StartAddress, 
    uint16_t  Quantity, 
    uint8_t  *pDst,
    uint16_t *pDstLen
    );

/**
 * @brief 字节数组复制, 复制到寄存器
 * @param pSrc            数据源
 * @param RegStartAddress 寄存器的地址,字节序号
 * @param Quantity        寄存器数量
 * @param pReg            指针,寄存器
 * @param pDstLen         写入数据的长度
 * @ret   MB_OK 成功 MB_ERROR 错误
*/
MB_StatusTypeDef MB_ByteArrayCopyTo(
    uint8_t  *pSrc, 
    uint16_t  RegStartAddress, 
    uint16_t  Quantity, 
    uint8_t  *pReg,
    uint16_t *pDstLen
    );

/**
 * @brief 字节数组复制,从寄存器复制出来
 * @param pReg            指针,寄存器
 * @param RegStartAddress 寄存器开始的地址,字节序号
 * @param Quantity        寄存器数量
 * @param pDst            指针,写入数据的位置
 * @param pDstLen         指针,写入数据的长度
 * @ret   MB_OK 成功 MB_ERROR 错误
*/
MB_StatusTypeDef MB_ByteArrayCopyFrom(
    uint8_t  *pReg, 
    uint16_t  RegStartAddress, 
    uint16_t  Quantity, 
    uint8_t  *pDst,
    uint16_t *pDstLen
    );

/**
 * @brief 位数组转字节数据, 读数据时,可能会从一个字节的中间读取,比如第1,2...7
 * @param value        值
 * @param pReg         指针,寄存器
 * @param StartAddress 开始的地址 
 * @ret   MB_OK 成功 MB_ERROR 错误
*/
MB_StatusTypeDef MB_BitSetReset(uint16_t value, uint8_t *pReg, uint16_t StartAddress);

/**
 * @brief 位数组操作
 * @param pSrc         源数据
 * @param pReg         指针,寄存器
 * @param StartAddress 位开始的地址 
 * @param Quantity     位寄存器数量
 * @ret   MB_OK 成功 MB_ERROR 错误
*/
MB_StatusTypeDef MB_BitArraySetReset(uint8_t *pSrc, uint8_t *pReg, uint16_t StartAddress, uint16_t Quantity);

/**
 * @brief 判断接数据帧的长度
 * @param pReqADU   指针,输入数据
 * @ret pDstLen 数据长度
*/
 uint16_t MB_SLAVE_GetPacketLength(uint8_t *pSrc);
#endif
